#!/usr/bin/env python3
'''ultrasonic ranging using I2C'''  # 使用I2C通信协议进行超声波测距
'''software tools : smbus'''    # 使用smbus库
'''hardware       : KS103    ''' # KS103超声波模块

import smbus   # 加载smbus通信库
import time

# 初始化I2C总线设备文件（1表示使用/dev/i2c-1设备）
bus = smbus.SMBus(1) #open /dev/i2c-1（对应GPIO2/3物理引脚）

# 设备参数配置
address = 0x74 #i2c device address（7位地址，十六进制表示，对应十六进制0x74）
wr_cmd = 0xb0  #range 0-5m, return distance(mm)（写入寄存器的值为0xb0时，为测量距离模式，单位mm）
#rd_cmd = 0xb2 #（写入寄存器的值为0xb2时，为测量距离模式，以时间计算，单位us）
##range 0-5m, return flight time(us), remember divided by 2
#测量范围为0-5m，返回的是测得声波传回的时间，距离=时间x声速/2
try:#便于捕获Ctrl-C中断，从而清理资源并退出
    # 主测量循环持续测量
    while True:
        # 发送测量指令（向地址0x74的寄存器0x2写入0xb0，以单位mm来计算）
        bus.write_byte_data(address, 0x2, wr_cmd)
        
        # 等待测量完成（最小间隔33ms）
        time.sleep(1) #MIN ~ 0.033（延时1s确保数据稳定）
        
        # 读取传感器寄存器（高位字节在寄存器0x2，低位字节在0x3）
        HighByte = bus.read_byte_data(address, 0x2) # 距离值高8位
        LowByte = bus.read_byte_data(address, 0x3)  # 距离值低8位
        
        # 将两个8位字节组合为16位整数
        Dist = (HighByte << 8) + LowByte # 位移合并字节
        
        # 输出转换后的距离值（毫米转厘米，Python隐含精度控制，自动打印1位小数）
        print('Distance:', Dist/10.0, 'cm')
        #time.sleep(2)
except KeyboardInterrupt: # 捕获Ctrl+C信号
    pass

# 关闭I2C连接
bus.close()
print('Range over!') # 程序终止
